#!/usr/bin/env python3
"""
配置文件
"""

import os
from datetime import timedelta
from dotenv import load_dotenv

# 加载 .env 文件
load_dotenv()

# 获取当前文件所在目录（api_server目录）
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# 实例目录（用于存放数据库）
INSTANCE_DIR = os.path.join(BASE_DIR, 'instance')
if not os.path.exists(INSTANCE_DIR):
    os.makedirs(INSTANCE_DIR)

# 缓存目录
CACHE_DIR = os.path.join(BASE_DIR, 'cache')
if not os.path.exists(CACHE_DIR):
    os.makedirs(CACHE_DIR)

class Config:
    """基础配置"""
    
    # 环境检测
    FLASK_ENV = os.environ.get('FLASK_ENV', 'development')
    DEBUG = os.environ.get('FLASK_DEBUG', 'True').lower() in ('true', '1', 'yes')
    
    # 安全密钥
    SECRET_KEY = os.environ.get('SECRET_KEY')
    if not SECRET_KEY:
        if FLASK_ENV == 'production':
            raise ValueError(
                "生产环境必须设置 SECRET_KEY 环境变量！\n"
                "生成方法: python -c \"import secrets; print(secrets.token_hex(32))\""
            )
        else:
            SECRET_KEY = 'dev-secret-key-change-in-production'
            print("⚠️  警告：使用默认的 SECRET_KEY，仅用于开发环境")
    
    JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY')
    if not JWT_SECRET_KEY:
        if FLASK_ENV == 'production':
            raise ValueError(
                "生产环境必须设置 JWT_SECRET_KEY 环境变量！\n"
                "生成方法: python -c \"import secrets; print(secrets.token_hex(32))\""
            )
        else:
            JWT_SECRET_KEY = 'jwt-secret-key-change-in-production'
            print("⚠️  警告：使用默认的 JWT_SECRET_KEY，仅用于开发环境")
    
    # 数据库配置 - 使用绝对路径
    DB_PATH = os.path.join(INSTANCE_DIR, 'feng_admin.db')
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or f'sqlite:///{DB_PATH}'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    # SQLite 优化配置
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_pre_ping': True,
        'pool_recycle': 300,
        'connect_args': {
            'timeout': 20,
            'check_same_thread': False
        }
    }
    
    # JWT 配置
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(
        hours=int(os.environ.get('JWT_ACCESS_TOKEN_EXPIRES', 24))
    )
    JWT_REFRESH_TOKEN_EXPIRES = timedelta(
        days=int(os.environ.get('JWT_REFRESH_TOKEN_EXPIRES', 30))
    )
    
    # CORS 配置
    cors_origins_str = os.environ.get('CORS_ORIGINS')
    if cors_origins_str:
        CORS_ORIGINS = [origin.strip() for origin in cors_origins_str.split(',')]
    else:
        # 默认允许所有源访问（开发环境）
        # 生产环境建议通过 CORS_ORIGINS 环境变量指定具体的域名
        CORS_ORIGINS = '*'
    
    # 服务器配置
    FLASK_HOST = os.environ.get('FLASK_HOST', '0.0.0.0')
    FLASK_PORT = int(os.environ.get('FLASK_PORT', 5001))
    
    # 缓存配置
    CACHE_DIR = CACHE_DIR
    GITHUB_TRENDING_CACHE_HOURS = int(os.environ.get('GITHUB_TRENDING_CACHE_HOURS', 4))
    
    # 日志配置
    LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO')
    
    # 邮件自动拉取配置
    EMAIL_FETCH_INTERVAL = int(os.environ.get('EMAIL_FETCH_INTERVAL', 10))  # 拉取间隔（分钟）
    EMAIL_AUTO_FETCH = os.environ.get('EMAIL_AUTO_FETCH', 'false').lower() in ('true', '1', 'yes')
    
    # 邮件拉取优化配置
    EMAIL_INITIAL_FETCH_DAYS = int(os.environ.get('EMAIL_INITIAL_FETCH_DAYS', 7))  # 首次拉取最近7天，而不是30天
    EMAIL_INITIAL_FETCH_COUNT = int(os.environ.get('EMAIL_INITIAL_FETCH_COUNT', 50))  # 每个文件夹最多50封
    EMAIL_HISTORY_BATCH_SIZE = int(os.environ.get('EMAIL_HISTORY_BATCH_SIZE', 50))  # 历史邮件批次大小
    EMAIL_INCREMENTAL_FETCH_ENABLED = os.environ.get('EMAIL_INCREMENTAL_FETCH_ENABLED', 'true').lower() in ('true', '1', 'yes')  # 启用增量拉取
    EMAIL_IDLE_ENABLED = os.environ.get('EMAIL_IDLE_ENABLED', 'true').lower() in ('true', '1', 'yes')  # 是否启用IDLE
    EMAIL_FALLBACK_POLL_INTERVAL = int(os.environ.get('EMAIL_FALLBACK_POLL_INTERVAL', 120))  # IDLE失败时的轮询间隔（秒）

    # 功能开关（从环境变量读取，默认为启用）
    FEATURE_AUTH = os.environ.get('FEATURE_AUTH', 'true').lower() in ('true', '1', 'yes')
    FEATURE_CRUD = os.environ.get('FEATURE_CRUD', 'true').lower() in ('true', '1', 'yes')
    FEATURE_EXCEL = os.environ.get('FEATURE_EXCEL', 'true').lower() in ('true', '1', 'yes')
    FEATURE_GH_TRENDING = os.environ.get('FEATURE_GH_TRENDING', 'true').lower() in ('true', '1', 'yes')
    FEATURE_AI = os.environ.get('FEATURE_AI', 'true').lower() in ('true', '1', 'yes')
    FEATURE_CRAWLER = os.environ.get('FEATURE_CRAWLER', 'false').lower() in ('true', '1', 'yes')
    FEATURE_RBAC = os.environ.get('FEATURE_RBAC', 'false').lower() in ('true', '1', 'yes')
    FEATURE_TESTS = os.environ.get('FEATURE_TESTS', 'true').lower() in ('true', '1', 'yes')
    
    @classmethod
    def init_app(cls, app):
        """初始化应用配置"""
        # 打印配置信息（敏感信息脱敏）
        if cls.DEBUG:
            print("\n" + "=" * 60)
            print("Feng Admin - 配置信息")
            print("=" * 60)
            print(f"环境: {cls.FLASK_ENV}")
            print(f"调试模式: {cls.DEBUG}")
            print(f"数据库: {cls.SQLALCHEMY_DATABASE_URI}")
            print(f"CORS 源: {cls.CORS_ORIGINS}")
            print(f"JWT Token 过期: {cls.JWT_ACCESS_TOKEN_EXPIRES}")
            print(f"日志级别: {cls.LOG_LEVEL}")
            print("功能开关:")
            print(f"  AUTH={cls.FEATURE_AUTH}, CRUD={cls.FEATURE_CRUD}, EXCEL={cls.FEATURE_EXCEL}")
            print(f"  GH_TRENDING={cls.FEATURE_GH_TRENDING}, AI={cls.FEATURE_AI}, CRAWLER={cls.FEATURE_CRAWLER}, RBAC={cls.FEATURE_RBAC}")
            print("=" * 60 + "\n")

